N = 100 + 10
fa, x, y, ans = [0] * N, [0] * N, [0] * N, 0
def find(root):
if root == fa[root]: return root
fa[root] = find(fa[root])
return fa[root]
def merge(a, b):
ra, rb = find(a), find(b)
if ra == rb: return
fa[ra] = rb
n = int(input())
for i in range(1, n + 1):
_x, _y = map(int, input().split())
x[i] = _x
y[i] = _y
for i in range(1, n + 1): fa[i] = i
for a in range(1, n + 1):
for b in range(a + 1, n + 1):
if x[a] == x[b] or y[a] == y[b]:
merge(a, b)
for i in range(1, n + 1):
if fa[i] == i: ans += 1
print(str(ans - 1))
#include <bits/stdc++.h>
using namespace std;
#define futaba ios_base::sync_with_stdio(false); cin.tie(NULL);
#define rio return 0;
#define fi first
#define se second
// Fun things are fun. //
pair<int, int> a[105];
vector<int> adj[105];
bool vis[105];
void dfs(int n) {
vis[n] = true;
for(auto i : adj[n]) {
if(!vis[i]) {
dfs(i);
}
}
}
int main() {
/* freopen(".txt", "r", stdin);
freopen(".txt", "w", stdout); */
futaba
int n;
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i].fi >> a[i].se;
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if(a[i].fi == a[j].fi) {
adj[i].push_back(j);
adj[j].push_back(i);
}
if(a[i].se == a[j].se) {
adj[i].push_back(j);
adj[j].push_back(i);
}
}
}
int ans = 0;
for(int i = 0; i < n; i++) vis[i] = false;
for(int i = 0; i < n; i++) {
if(!vis[i]) {
dfs(i);
ans++;
}
}
ans--;
cout << ans << '\n';
rio
}
957. Prison Cells After N Days | 946. Validate Stack Sequences |
921. Minimum Add to Make Parentheses Valid | 881. Boats to Save People |
497. Random Point in Non-overlapping Rectangles | 528. Random Pick with Weight |
470. Implement Rand10() Using Rand7() | 866. Prime Palindrome |
1516A - Tit for Tat | 622. Design Circular Queue |
814. Binary Tree Pruning | 791. Custom Sort String |
787. Cheapest Flights Within K Stops | 779. K-th Symbol in Grammar |
701. Insert into a Binary Search Tree | 429. N-ary Tree Level Order Traversal |
739. Daily Temperatures | 647. Palindromic Substrings |
583. Delete Operation for Two Strings | 518. Coin Change 2 |
516. Longest Palindromic Subsequence | 468. Validate IP Address |
450. Delete Node in a BST | 445. Add Two Numbers II |
442. Find All Duplicates in an Array | 437. Path Sum III |
436. Find Right Interval | 435. Non-overlapping Intervals |
406. Queue Reconstruction by Height | 380. Insert Delete GetRandom O(1) |